package com.lee.rabbitmq.exchange.direct;

import com.lee.rabbitmq.util.RabbitMqUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * 使用direct策略交换机发送消息
 *
 * @author Lee
 * @createDate 2021/12/14 15:04
 */
public class Send {
    public static void main(String[] args) {
        Connection connection = RabbitMqUtil.getConnection();
        Channel channel = null;
        try {
            channel = connection.createChannel();
            //声明队列
            channel.queueDeclare("myDirectQueue",true,false,false,null);

            /**
             * 声明一个交换机
             * 参数1  为交换机的名称取值任意
             * 参数2  为交换机的类型取值为direct、fanout.、 topic. headers
             * 参数3  为是否为持久化交换机
             * 注意:
             *  1、声明交换机时如果这个交换机应存在则会放弃声明，如果交换机不存在则声明交换机
             *  2、这个代码是可有可无的但是在使用前必须要确保这个交换机被声明
             */
            channel.exchangeDeclare("directExchange","direct",true);

            /**
             * 将队列绑定到交换机
             * 参数1  为队列的名称
             * 参数2  为交换机名称
             * 参数3  为消息的Routingkey(就是Bindingkey )
             * 注意:
             *  1、在进行队列和交换机绑定时必须要确保交换机和队列已经成功的声明
             */
            channel.queueBind("myDirectQueue","directExchange","directRoutingKey");
            String message = "direct测试消息！";
            /**
             * 发送消息到指定的队列
             * 参数1  为交换机名称
             * 参数2  为消息的RoutingKey如果这个消息的RoutingKey和某个队列与交换机绑定的RoutingKey一致,那么这个消息就会发送的指定的队列中
             * 注意:
             *   1、发送消息时必须确保交换机已经创建并且确保已经正确的绑定到了某个队列
             */
            channel.basicPublish("directExchange","directRoutingKey",null,message.getBytes("utf-8"));
            System.out.println("消息发送成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            RabbitMqUtil.close(connection,channel);
        }
    }
}
